#include <iostream>
#include <sw/redis++/redis++.h>
#include <thread>
#include "../util.hpp"

/*
    通用命令的基本使用
*/

void test1(sw::redis::Redis& redis)
{
    // keys使用
    redis.flushall();

    redis.set("key1", "111");
    redis.set("key2", "222");
    redis.set("key3", "333");
    redis.set("key4", "444");
    redis.set("key5", "555");
    redis.set("key6", "666");

    std::vector<std::string> result;
    auto it = std::back_inserter(result); // 创建一个插入迭代器
    redis.keys("*", it); // 第二个参数是插入迭代器，将结果通过it存放到result中
    printContainer(result);
}

void test2(sw::redis::Redis& redis)
{
    // exists使用
    redis.flushall();

    redis.set("key1", "111");
    redis.set("key2", "222");
    redis.set("key3", "333");
    redis.set("key4", "444");

    long long ret = redis.exists("key1");
    std::cout << "ret=" << ret << std::endl; // 1

    ret = redis.exists("key6");
    std::cout << "ret=" << ret << std::endl; // 0

    ret = redis.exists({"key1", "key2", "key7"});
    std::cout << "ret=" << ret << std::endl; // 2 

    std::vector<std::string> v = {"key1", "key2", "key7"};
    ret = redis.exists(v.begin(), v.end());
    std::cout << "ret=" << ret << std::endl; // 2
}

void test3(sw::redis::Redis& redis)
{
    // del使用
    redis.flushall();
    redis.set("key1", "111");
    redis.set("key2", "111");
    redis.set("key3", "111");
    redis.set("key4", "111");

    long long ret = redis.del("key1");
    std::cout << "ret=" << ret << std::endl; // 1

    ret = redis.del({"key2", "key3", "key7"});
    std::cout << "ret=" << ret << std::endl; // 2
}

void test4(sw::redis::Redis& redis)
{
    // expire 和 ttl(pexpire和pttl)
    redis.flushall();
    redis.set("key1", "111");
    redis.expire("key1", std::chrono::seconds(10)); // 10s
    long long ret = redis.ttl("key1");
    std::cout << "ret=" << ret << std::endl;

    redis.set("key2", "222");
    redis.expire("key2", std::chrono::minutes(1)); // 60s
    ret = redis.ttl("key2");
    std::cout << "ret=" << ret << std::endl;

    using namespace std::chrono_literals; // 使用这个命名空间之后，下面的事件就可以直接给普通事件格式
    redis.set("key3", "333");
    redis.expire("key3", 10s);
    std::this_thread::sleep_for(3s); // 休眠3s（c++线程库中的函数，不适用sleep因为没有跨平台性，sleep是linux中，Sleep是window中）
    ret = redis.ttl("key3");
    std::cout << "ret=" << ret << std::endl;
}

void test5(sw::redis::Redis& redis)
{
    // type使用
    redis.flushall();
    redis.set("key1", "111"); // string类型
    std::string ret = redis.type("key1");
    std::cout << "ret=" << ret << std::endl;

    redis.lpush("key2", "222", "2222"); // lish类型
    ret = redis.type("key2");
    std::cout << "ret=" << ret << std::endl;

    redis.hset("key3", std::make_pair("a", "1")); // hash类型
    ret = redis.type("key3");
    std::cout << "ret=" << ret << std::endl;

    redis.sadd("key4", "444", "4444"); // set类型
    ret = redis.type("key4");
    std::cout << "ret=" << ret << std::endl;

    redis.zadd("key5", "555", 89.99); // zset类型
    ret = redis.type("key5");
    std::cout << "ret=" << ret << std::endl;
}


int main()
{
    sw::redis::Redis redis("tcp://127.0.0.1:6379"); // 创建一个redis对象，给定url

    // test1(redis);
    // test2(redis);
    // test3(redis);
    // test4(redis);
    test5(redis);

    return 0;
}